#include<iostream>
using namespace std;

class Date
{
public:
	Date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	//拷贝构造函数 用一个已经存在的对象对另外一个对象进行初始化
	Date(const Date& d)
	{
		cout << "Date()" << endl;
		_year = d._year;
		_month =d._month;
		_day = d._day;
	}

	//运算符重载
	bool operator<(const Date& d)
	{
		if (_year < d._year)
		{
			return true;
		}
		else if (_year == d._year && _month < d._month)
		{
			return true;
		}
		else if (_year == d._year && _month == d._month && _day < d._day)
		{
			return true;
		}
		else
			return false;
	}

	//赋值运算符重载函数  把一个已存在的对象拷贝给另外一个已存在的对象
	//如果不使用引用返回 在拷贝过程中会调用拷贝构造函数
	//1.如果没有定义赋值运算符重载函数 编译器会自动生成默认赋值运算符重载函数 内置类型按字节顺序进行浅拷贝 自定义类型会去调用它类里的赋值运算符重载函数
	//2.进行深拷贝必须自己写赋值运算符重载函数
	//3.赋值运算符只能重载类的成员函数，不能重载全局函数 因为会和编译器生成的类内默认成员函数冲突 但声明可以在类内 定义在类外
	Date& operator=(const Date& d)
	{
		//判断是否为自拷贝
		if (this != &d)
		{
			_year = d._year;
			_month = d._month;
			_day = d._day;
		}
		return *this;
	}

	void print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}

private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1(2024, 7, 9);
	d1.print();
	Date d2(2024,8,11);
	d2.print();
	Date d3(d2);
	d3.print();

	cout << (d1 < d2) << endl;
	cout << d1.operator<(d2) << endl;

	Date d4, d5;
	d4 = d5 = d2;  //赋值
	d4.print();
	d5.print();

	return 0;

}